package com.briup.day05;

import java.util.Arrays;
import java.util.Random;

public class ArrayHomework2 {
    public static void main(String[] args) {
        // 调用initArr()方法，获取返回值
        int[] arr = initArr();
        // 在上述数组中获取最大值
        System.out.println("数组中的最大值为：" + getMaxValue(arr));
        // 获取次大值
        System.out.println("数组中的次大值为：" + getSecondValue(arr));
        // 获取第5大的值
        System.out.println("数组中的第5大值为：" + getNMaxValue(arr, 5));
        System.out.println("数组中的第最小值为：" + getNMaxValue(arr, 11));
    }

    /**
     * 获取指定n大的值，n为1是获取最大值，n>=arr.length时获取最小值
     *
     * @param arr 整型数组
     * @param n   排位序号
     */
    private static int getNMaxValue(int[] arr, int n) {
        n = Math.min(arr.length, n);
        // 给数组排序，使用冒泡排序
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        return arr[arr.length - n];
    }

    private static int getSecondValue(int[] arr) {
        // 使用Math类中的max方法，可以获取两个数据间的最大值
        int max = Math.max(arr[0], arr[1]);
        // min方法同理，获取最小值
        int sec = Math.min(arr[0], arr[1]);
        // 遍历数组
        for (int i = 2; i < arr.length; i++) {
            if (arr[i] > sec && arr[i] < max) {
                sec = arr[i];
            } else if (arr[i] > max) {
                // 如果当前的值比原本最大值更大，那么将原本的最大值赋值给次大值
                sec = max;
                // 将当前值，赋值给最大值变量
                max = arr[i];
            }
        }
        return sec;
    }

    private static int getMaxValue(int[] arr) {
        // 假定第1个元素为最大值
        int max = arr[0];
        // 遍历数组，进行两两对比后，才能确定哪一个是最大值
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i]) {
                // 如果前面的最大值小于本次获取的元素值，那么本元素值就是当前的最大值
                max = arr[i];
            }
        }
        return max;
    }

    private static int[] initArr() {
        // 创建一个长度为10的数组，向数组中存放随机数，要求数组中不存在重复的数据
        int[] arr = new int[10];
        Random rand = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = rand.nextInt(101);
            for (int j = 0; j < i; j++) {
                // 说明当前生成的随机数，与前面生成的随机数重复
                if (arr[j] == arr[i]) {
                    // 舍弃本轮生成的随机数，重新生成
                    i--;
                    // 跳出当前循环
                    break;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        return arr;
    }
}
